#include "base_all.h"
#ifdef _WIN32
#include <windows.h>
#elif __linux__
#include <unistd.h>
#endif

s32 g_iDbgLevel = CRITICAL;
s08 *l_ErrLevelDsc[ERR_MAX] = {"ignore", "warnning", "critcal", "fatal"};

s08 *base_show_size(u32 uiLen)
{
    static s08 str[120];
    u32 uiTemp = uiLen;
    u08 ucUint = 0;

    while (1)
    {
        uiTemp /= 1024;
        if (uiTemp)
        {
            ucUint++;
        }
        else
        {
            break;
        }
    }

    switch (ucUint)
    {
    case 0:
        sprintf(str, "%d B", uiLen);
        break;

    case 1:

        sprintf(str, "%d.%03d KB", uiLen / 1024, (uiLen % 1024) * 1000 / 1024);
        break;

    case 2:
        sprintf(str, "%d.%03d MB", uiLen / 1024 / 1024, (uiLen / 1024 % 1024) * 1000 / 1024);
        break;

    case 3:
        sprintf(str, "%d.%03d GB", uiLen / 1024 / 1024 / 1024, (uiLen / 1024 / 1024 % 1024) * 1000 / 1024);
        break;
    }
    return str;
}

s32 base_show_str(u08 *pucBuff, u32 uiLen)
{
    u08 ucaBuff[16];
    s08 ucaBuff1[200] = {0};
    s32 i, j;

    for (i = 0; i < uiLen; i++)
    {
        if (i % 16 == 0)
        {
            if (i)
            {
                sprintf(&ucaBuff1[strlen(ucaBuff1)], "   *");
                for (j = 0; j < 16; j++)
                {
                    if (!isgraph(ucaBuff[j]))
                    {
                        sprintf(&ucaBuff1[strlen(ucaBuff1)], ".");
                    }
                    else
                    {
                        sprintf(&ucaBuff1[strlen(ucaBuff1)], "%c", ucaBuff[j]);
                    }
                }
                sprintf(&ucaBuff1[strlen(ucaBuff1)], "*");
                printf("%s", ucaBuff1);
                ucaBuff1[0] = 0;
            }
            printf("\r\n%04x: ", i);
        }
        printf("%02X ", pucBuff[i]);
        ucaBuff[i % 16] = pucBuff[i];
    }

    i %= 16;
    if (i == 0)
    {
        i = 16;
    }

    for (j = 0; j < (16 - i); j++)
        sprintf(&ucaBuff1[strlen(ucaBuff1)], "   ");

    sprintf(&ucaBuff1[strlen(ucaBuff1)], "   *");
    for (j = 0; j < i; j++)
    {
        if (!isalnum(ucaBuff[j]))
        {
            sprintf(&ucaBuff1[strlen(ucaBuff1)], ".");
        }
        else
        {
            sprintf(&ucaBuff1[strlen(ucaBuff1)], "%c", ucaBuff[j]);
        }
    }
    sprintf(&ucaBuff1[strlen(ucaBuff1)], "*");
    printf("%s", ucaBuff1);
    ucaBuff1[0] = 0;
    printf("\r\n\r\n");
    return BASE_OK;
}

s32 base_get_file_timeStamp(s08 *fileName, s08 *strTime)
{
    return BASE_OK;
}

u16 base_bcd2bin(u16 input)
{
    u16 output;
    output = ((input >> 12) & 0x000f) * 1000 + ((input >> 8) & 0x000f) * 100 + ((input >> 4) & 0x000f) * 10 + (input & 0x000f);
    return output;
}

u16 base_bin2bcd(u16 input)
{
    u16 temp;
    u16 output;
    output = (((input / 1000) << 12) & 0xf000);
    temp = input % 1000;
    output = output + (((temp / 100) << 8) & 0x0f00);
    temp = temp % 100;
    output = output + (((temp / 10) << 4) & 0x00f0);
    temp = temp % 10;
    output = output + (temp & 0x000f);

    return output;
}

s32 base_bcd_valid(u08 ucTemp)
{
    if ((ucTemp & 0x0f) > 9)
    {
        return BASE_ERROR;
    }

    if ((ucTemp >> 4) > 9)
    {
        return BASE_ERROR;
    }

    return BASE_OK;
}
